/******************************************************************************/
/* Fichero: Servidor.java
/* Versión: 1.0
/* Autor: Ana Belen Cambra
/* Fecha: Mayo 2009
/* Proyecto: Gestor de Cumpleaños de AelanSoft - Cliente
/* Descripción: Programa principal del servidor
/******************************************************************************/
package rmi;

import java.sql.*;
import java.rmi.*;
import java.net.InetAddress;

/******************************************************************************/
public class Servidor {
/******************************************************************************/

   // Variables Base de Datos
   static String USUARIO = "c8051898";
   static String CONTRASENA = "crafty15";
   static Connection baseDeDatos;

   // Variables Cliente-Servidor
   private static int puerto = 1234;
   private static String nombreObjeto = "objeto";

   /****************************************************************************
    * Conexion con la base de datos
    * @param usuario usuario de la base de datos
    * @param contrasena contraseña de la base de datos
    * @return estado codigo de estado
    ***************************************************************************/
   public static Integer ConectarBD(String usuario, String contrasena) {
      String driver = "oracle.jdbc.driver.OracleDriver";
      String conexion = "jdbc:oracle:thin";
      String host = ":@den.cps.unizar.es";
      String sid = "vicious";
      String port = "1521";
      try {
         // cargar el driver JDBC
         Class.forName(driver);
         // establecer conexion con la base de datos
         String direccion = conexion + host + ":" + port + ":" + sid;
         baseDeDatos = DriverManager.getConnection(direccion, usuario, contrasena);
         // finalizacion correcta
         crearTablas();
         return 0;
      }
      catch (ClassNotFoundException e) {
         return -1;
      }
      catch (SQLException e) {
         // error al conectar con la base de datos
         return 2;
      }
   }

   /****************************************************************************
    * Creacion de las tablas en la base de datos si no existen
    * @return estado codigo de estado
    ***************************************************************************/
   public static Integer crearTablas() {
      String tablaUsuario = "CREATE TABLE Usuario(" +
            "mail varchar2(30)," +
            "nombre varchar2(20) NOT NULL," +
            "apellidos varchar2(50) NOT NULL," +
            "contrasena varchar2(12) NOT NULL," +
            "dia integer NOT NULL," +
            "mes integer NOT NULL," +
            "CONSTRAINT usuario_PK PRIMARY KEY(mail))";
      String tablaSerAmigoDe = "CREATE TABLE SerAmigoDe(" +
            "usuario1 varchar2(30) NOT NULL, " +
            "usuario2 varchar2(30) NOT NULL," +
            "CONSTRAINT usuario1_FK FOREIGN KEY (usuario1)  " +
            "REFERENCES usuario(mail), " +
            "CONSTRAINT usuario2_FK FOREIGN KEY (usuario2)  " +
            "REFERENCES usuario(mail), " +
            "CONSTRAINT amigos_PK PRIMARY KEY (usuario1,usuario2))";

      try {
         Statement stmtTabla = baseDeDatos.createStatement();
         // crear tabla usuario
         stmtTabla.executeQuery(tablaUsuario);
         try {
            // crear tabla SerAMigoDe
            stmtTabla.executeQuery(tablaSerAmigoDe);
         }
         catch (SQLException e) {
            // la tabla ya existe, no hace nada
         }
      } catch (SQLException e) {
         // la tabla ya existe, no hacer nada
      }
      return 0;
   }

   /****************************************************************************
    * Desconexion de la base de datos
    * @return estado codigo de estado
    ***************************************************************************/
   public static Integer DesconectarBD() {

      try {
         baseDeDatos.close();
         baseDeDatos = null;
         return 0;
      }
      catch (SQLException e) {
         baseDeDatos = null;
         return (3);
      }
   }

   /****************************************************************************
    * Procedimiento principal "main"
    * @param args argumento de entrada
    ***************************************************************************/
   public static void main(String[] args) {
      Integer codigoError;
      if ((codigoError = ConectarBD(USUARIO, CONTRASENA)) == 0) {
         Connection c = baseDeDatos;
         try {

         // Lanzamos el rmiregistry
         java.rmi.registry.LocateRegistry.createRegistry(puerto);

         // Obtemos la direccion IP
         InetAddress direccion = InetAddress.getLocalHost();
         String IP = direccion.getHostName();

         // Registramos el objeto en el registro de RMI
         ClaseRemotaServidor servidor = new ClaseRemotaServidor(c);
         Naming.rebind("//" + IP + ":" + puerto + "/" + nombreObjeto, servidor);

         //Mostrar informacion del sevidor
         System.out.println("--------------------");
         System.out.println(" SERVIDOR ARRANCADO ");
         System.out.println("--------------------");
         System.out.println("La direccion IP es: " + IP);
         System.out.println("El puerto es: " + puerto);
         System.out.println("El nombre del objeto Remoto es: " + nombreObjeto);

         } catch (Exception e) {
         }
      }
   }
}

